#include <bits/stdc++.h>
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Rev(i,a,b) for(int i=a;i>=b;i--)
#define Fin(file) freopen(file,"r",stdin)
#define Fout(file) freopen(file,"w",stdout)
#define LOG(...) fprintf(stderr,__VA_ARGS__)
using namespace std; using ll = long long;
constexpr int N=1e6+5; using pii = pair<int,int>;
#define k1 (k<<1)
#define k2 (k<<1|1)
class STree1{
	int n,del[N],mx[N<<2]; vector<int> at[N],vec[N];
	void modify(int k,int l,int r,int x){
		if(l==r){
			while(vec[l].size()&&del[vec[l].back()]) vec[l].pop_back();
			mx[k]=vec[l].size()?vec[l].back():0; return;
		}
		int mid=(l+r)>>1; x<=mid?modify(k1,l,mid,x):modify(k2,mid+1,r,x);
		mx[k]=max(mx[k1],mx[k2]);
	}
	int query(int k,int l,int r,int ql,int qr){
		if(ql<=l&&r<=qr) return mx[k];
		int mid=(l+r)>>1,res=0;
		if(ql<=mid) res=max(res,query(k1,l,mid,ql,qr));
		if(mid+1<=qr) res=max(res,query(k2,mid+1,r,ql,qr));
		return res;
	}
public:
	void init(int _n) { n=_n; }
	void insert(int x,int o) { assert(x>=1&&x<=n); at[o].push_back(x); vec[x].push_back(o); modify(1,1,n,x); }
	void erase(int o) { del[o]=1; for(int x:at[o]) modify(1,1,n,x); }
	int query(int l,int r) { assert(l<=r&&l>=1&&r<=n); return query(1,1,n,l,r); }
}T1;
class STree2{
	int n,del[N]; vector<int> vec[N<<2];
	void insert(int k,int l,int r,int ql,int qr,int o){
		if(ql<=l&&r<=qr) return vec[k].push_back(o),void();
		int mid=(l+r)>>1;
		if(ql<=mid) insert(k1,l,mid,ql,qr,o);
		if(mid+1<=qr) insert(k2,mid+1,r,ql,qr,o);
	}
	int query(int k,int l,int r,int x){
		while(vec[k].size()&&del[vec[k].back()]) vec[k].pop_back();
		int res=vec[k].size()?vec[k].back():0, mid=(l+r)>>1;
		if(l==r) return res; else return max(res,x<=mid?query(k1,l,mid,x):query(k2,mid+1,r,x));
	}
public:
	void init(int _n) { n=_n; }
	void insert(int l,int r,int o) { insert(1,1,n,l,r,o); }
	void erase(int o) { del[o]=1; }
	int query(int x) { return query(1,1,n,x); }
}T2;
int n,m,K,tot,del[N],X1[N],X2[N],Y1[N],Y2[N]; vector<int> lis[N];
int main(){
	Fin("grid.in"); Fout("grid.out");
	ios::sync_with_stdio(0); cin.tie(0);
	cin>>n>>m>>K; For(i,1,K) { int x,y; cin>>x>>y; lis[x].push_back(y); }
	T1.init(m); T2.init(m);
	For(xxx,1,n){
		for(int yyy:lis[xxx]){
			tot++; X1[tot]=X2[tot]=xxx; Y1[tot]=Y2[tot]=yyy;
			auto merge=[&](int v){
				T1.erase(v); T2.erase(v); del[v]=1;
				X1[tot]=min(X1[tot],X1[v]); X2[tot]=max(X2[tot],X2[v]);
				Y1[tot]=min(Y1[tot],Y1[v]); Y2[tot]=max(Y2[tot],Y2[v]);
			};
			while(true){
				int v=T1.query(max(1,Y1[tot]-2),min(m,Y2[tot]+2));
				if(v!=0&&X2[v]>=X1[tot]){
					merge(v);
					continue;
				}
				v=T1.query(max(1,Y1[tot]-1),min(m,Y2[tot]+1));
				if(v!=0&&X2[v]>=X1[tot]-1){
					merge(v);
					continue;
				}
				v=T1.query(max(1,Y1[tot]),min(m,Y2[tot]));
				if(v!=0&&X2[v]>=X1[tot]-2){
					merge(v);
					continue;
				}
				v=T2.query(Y1[tot]);
				if(v!=0&&X2[v]>=X1[tot]-2){
					merge(v);
					continue;
				}
				break;
			}
			T1.insert(Y1[tot],tot); T1.insert(Y2[tot],tot); T2.insert(Y1[tot],Y2[tot],tot);
		}
	}
	ll ans=0; For(i,1,tot) if(!del[i]) ans+=1ll*(X2[i]-X1[i]+1)*(Y2[i]-Y1[i]+1);
	cout<<ans<<'\n';
	return 0;
}